The U.S. has established nearly 1,000 Marine Protected Areas to protect important places in our ocean, estuaries, coastal waters, and Great Lakes. Marine Protected Areas strive to combat climate change, conserve cultural heritage, and protect marine organisms.
Marine protected areas allow for ecological connectivity, and serve as protected “stepping stones” for marine organisms. Let’s make a map so that we can see all of these stepping stones off of the Coast of California.
First, we’ll need to load in some data that has information on all of the Marine Protected Areas in the United States. The data is in the form of a “shape file”. We will load this file and call it “DataBase”.
DataBase = st_read("C:/Users/nposd/Documents/Outreach/MPAs/mpa_inventory_2014_public_shp.shp")
Reading layer `mpa_inventory_2014_public_shp' from data source `C:\Users\nposd\Documents\Outreach\MPAs\mpa_inventory_2014_public_shp.shp' using driver `ESRI Shapefile'
Simple feature collection with 1623 features and 24 fields
Geometry type: MULTIPOLYGON
Dimension: XY
Bounding box: xmin: -180 ymin: -15.38614 xmax: 180 ymax: 74.70742
Geodetic CRS: WGS 84
For this example, let’s look at the Marine Protected areas off the Coast of California. When looking at our database, we see that there is a column titled “State”, and each row contains the state that the Marine Protected Area is in. We will filter our database to pull out all of the Marine Protected Areas that are in the “State” of “California” using the following code chunk. We will call this new database “California”.
library(dplyr)
Attaching package: 㤼㸱dplyr㤼㸲
The following objects are masked from 㤼㸱package:stats㤼㸲:
filter, lag
The following objects are masked from 㤼㸱package:base㤼㸲:
intersect, setdiff, setequal, union
There are 185 Marine Protected Areas in our California database! Let’s make a map to see all of the boundaries of the Marine Protected Areas. The “geometry” column has the information of the boundaries. The geometry will give us the latitude and longitude, which we will use to plot the boundary of each Marine Protected Area on our map.
To set up the map, we will first map a blank map of the state of California. We will use built-in “leaflet” library to make our map. Let’s set it up so that we can see the ocean topography using the Esri Ocean Basemap. We’ll save our map as “CaliforniaMap”. To print the CaliforniaMap, we’ll type in CaliforniaMap.
Nice! Now let’s add the boundaries of all of the Marine Protected Areas that are on the California Coast. We will loop through each individual Marine Protected area, and plot the latitudes and longitudes on our California map, that way, we can see ALL of the Marine Protected Areas on our map together. We will use “addPolygons” to add each Marine Protected Area’s boundary. You can pick the color that you would like to make the boundary in the “color” section of “addPolygons”. For this example, I made the color red, but you can change it to whatever color you would like!
Wow, California has a LOT of Marine Protected Areas! Let’s analyze some data from Marine Protected Areas in California to see exactly how they have helped in the protection of marine organisms! We will need to connect to an online databases to access information about marine organisms. Additionally, some packages in R will need to be installed so that we can see exactly what is going in with our data. Run the code chunk below to install the packages necessary for this activity.
```r
taxa <- checklist(geometry = \POLYGON ((2.3 51.8
Let’s look into a specific Marine Protected Area now.
Scripps = filter(California, Site_Name == "Scripps Coastal Reserve")
ScrippsGeo = as.data.frame(California[[25]][[1]][[1]][[1]]) #the geometry is in the 25th column
ScrippsLongitude = Geo$V1 #Longitude is saved as Variable 1
ScrippsLatitude = Geo$V2 #Latitude is saved as Variable 2
POLYGON = list(Polygon = list(c(Longitude, Latitude)))
POLYGON = list(c(ScrippsLongitude, ScrippsLatitude))
x = st_cast(POLYGON, "POLYGON")
x = polygon(POLYGON)
WKPOLYGON = geojson2wkt(POLYGON$Polygon)
taxa <- checklist(geometry = "POLYGON ((2.3 51.8, 2.3 51.6, 2.6 51.6, 2.6 51.8, 2.3 51.8))")
taxa <- checklist(geometry = POLYGON)
mp <- list(MultiPoint = matrix(c(100, 101, 3.14, 3.101, 2.1, 2.18)))
poly <- list(Polygon = list(
matrix(c(100.001, 101.1, 101.001, 100.001, 0.001, 0.001, 1.001, 0.001), ncol = 2)))
geojson2wkt(poly)
geojson2wkt(poly, fmt=6)
SpeciesOccurence <- occurrence(geometry = poly)
taxa <- checklist(geometry = poly)
x = data.frame(lat = c("32°49.573", "32°47.945", "32°47.945", "32°49.573", "32°49.573"),
lon = c("-117°19.000", "-117°20.528", "-117°20.068", "-117°19.000", "-117°19.000"))
x$lat = gsub('°', ' ', x$lat)
x$lon = gsub('°', ' ', x$lon)
#convert from decimalminute to decimal degree
x$latdec = measurements::conv_unit(x$lat, from = 'deg_dec_min', to = 'dec_deg')
x$londec = measurements::conv_unit(x$lon, from = 'deg_dec_min', to = 'dec_deg')
taxa <- checklist(geometry = "POLYGON ((2.3 51.8, 2.3 51.6, 2.6 51.6, 2.6 51.8, 2.3 51.8))")
taxa <- checklist(geometry = POLYGON)
taxa = geometry(occurence())
latlon = rbind(Longitude, Latitude)
# <- occurrence(geometry = "POLYGON ((-117.32 32.83, -117.34 32.83, -117.33 32.80, -117.32 32.80, -117.32 32.83)) ")
animals = filter(SpeciesOccurence, kingdom == "Animalia") #filtering the dataframe to pull out the animals
sort(table(animals$scientificName), decreasing = TRUE)[1:10] #finding the 10 animals that occur most often in the dataframe
kelpBass = filter(SpeciesOccurence, scientificName == "Paralabrax clathratus") #since kelpbass is the most commonly occuring animal, pull out info on the kelp bass
ggplot(kelpBass, aes(x = date_year)) +
geom_histogram(color = "darkblue", fill = "lightblue") +
labs(title = "Kelp Bass in Anacapa State Marine Reserve", x = "Year", y = "# of Kelp Bass") # make a histogram showing the kelp bass count from 2006 through 2020
LS0tDQp0aXRsZTogIk1hcmluZSBQcm90ZWN0ZWQgQXJlYSBBY3Rpdml0eSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoZSBVLlMuIGhhcyBlc3RhYmxpc2hlZCBuZWFybHkgMSwwMDAgTWFyaW5lIFByb3RlY3RlZCBBcmVhcyB0byBwcm90ZWN0IGltcG9ydGFudCBwbGFjZXMgaW4gb3VyIG9jZWFuLCBlc3R1YXJpZXMsIGNvYXN0YWwgd2F0ZXJzLCBhbmQgR3JlYXQgTGFrZXMuIE1hcmluZSBQcm90ZWN0ZWQgQXJlYXMgc3RyaXZlIHRvIGNvbWJhdCBjbGltYXRlIGNoYW5nZSwgY29uc2VydmUgY3VsdHVyYWwgaGVyaXRhZ2UsIGFuZCBwcm90ZWN0IG1hcmluZSBvcmdhbmlzbXMuIA0KDQpNYXJpbmUgcHJvdGVjdGVkIGFyZWFzIGFsbG93IGZvciBlY29sb2dpY2FsIGNvbm5lY3Rpdml0eSwgYW5kIHNlcnZlIGFzIHByb3RlY3RlZCAic3RlcHBpbmcgc3RvbmVzIiBmb3IgbWFyaW5lIG9yZ2FuaXNtcy4gTGV0J3MgbWFrZSBhIG1hcCBzbyB0aGF0IHdlIGNhbiBzZWUgYWxsIG9mIHRoZXNlIHN0ZXBwaW5nIHN0b25lcyBvZmYgb2YgdGhlIENvYXN0IG9mIENhbGlmb3JuaWEuDQoNCkZpcnN0LCB3ZSdsbCBuZWVkIHRvIGxvYWQgaW4gc29tZSBkYXRhIHRoYXQgaGFzIGluZm9ybWF0aW9uIG9uIGFsbCBvZiB0aGUgTWFyaW5lIFByb3RlY3RlZCBBcmVhcyBpbiB0aGUgVW5pdGVkIFN0YXRlcy4gVGhlIGRhdGEgaXMgaW4gdGhlIGZvcm0gb2YgYSAic2hhcGUgZmlsZSIuIFdlIHdpbGwgbG9hZCB0aGlzIGZpbGUgYW5kIGNhbGwgaXQgIkRhdGFCYXNlIi4gDQoNCmBgYHtyfQ0KI2luc3RhbGwgYW5kIGxvYWQgdGhlICJzZiIgcGFja2FnZSB0byByZWFkIGluIHRoZSBkYXRhYnNlDQppbnN0YWxsLnBhY2thZ2VzKCJzZiIpDQpsaWJyYXJ5KCJzZiIpDQoNCiMgbG9hZGluZyBvdXIgZGF0YWJhc2UgYnkgc2V0dGluZyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBzaGFwZSBmaWxlIGxpdmVzIHdpdGggdGhlIGZpbGUgZXh0ZW5zaW9uICguc2hwKQ0KRGF0YUJhc2UgPSBzdF9yZWFkKCJDOi9Vc2Vycy9ucG9zZC9Eb2N1bWVudHMvT3V0cmVhY2gvTVBBcy9tcGFfaW52ZW50b3J5XzIwMTRfcHVibGljX3NocC5zaHAiKQ0KDQpgYGANCg0KRm9yIHRoaXMgZXhhbXBsZSwgbGV0J3MgbG9vayBhdCB0aGUgTWFyaW5lIFByb3RlY3RlZCBhcmVhcyBvZmYgdGhlIENvYXN0IG9mIENhbGlmb3JuaWEuIFdoZW4gbG9va2luZyBhdCBvdXIgZGF0YWJhc2UsIHdlIHNlZSB0aGF0IHRoZXJlIGlzIGEgY29sdW1uIHRpdGxlZCAiU3RhdGUiLCBhbmQgZWFjaCByb3cgY29udGFpbnMgdGhlIHN0YXRlIHRoYXQgdGhlIE1hcmluZSBQcm90ZWN0ZWQgQXJlYSBpcyBpbi4gV2Ugd2lsbCBmaWx0ZXIgb3VyIGRhdGFiYXNlIHRvIHB1bGwgb3V0IGFsbCBvZiB0aGUgTWFyaW5lIFByb3RlY3RlZCBBcmVhcyB0aGF0IGFyZSBpbiB0aGUgIlN0YXRlIiBvZiAiQ2FsaWZvcm5pYSIgdXNpbmcgdGhlIGZvbGxvd2luZyBjb2RlIGNodW5rLiBXZSB3aWxsIGNhbGwgdGhpcyBuZXcgZGF0YWJhc2UgIkNhbGlmb3JuaWEiLiANCg0KYGBge3J9DQojIGluc3RhbGwgYW5kIGxvYWQgdGhlICJkcGx5ciIgcGFja2FnZSB0byBoZWxwIHVzIGZpbHRlciBvdXIgZGF0YQ0KbGlicmFyeShkcGx5cikNCg0KQ2FsaWZvcm5pYSA9IGZpbHRlcihEYXRhQmFzZSwgU3RhdGUgPT0gIkNhbGlmb3JuaWEiKQ0KDQpgYGANCg0KVGhlcmUgYXJlIDE4NSBNYXJpbmUgUHJvdGVjdGVkIEFyZWFzIGluIG91ciBDYWxpZm9ybmlhIGRhdGFiYXNlISBMZXQncyBtYWtlIGEgbWFwIHRvIHNlZSBhbGwgb2YgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIE1hcmluZSBQcm90ZWN0ZWQgQXJlYXMuIFRoZSAiZ2VvbWV0cnkiIGNvbHVtbiBoYXMgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSBib3VuZGFyaWVzLiBUaGUgZ2VvbWV0cnkgd2lsbCBnaXZlIHVzIHRoZSBsYXRpdHVkZSBhbmQgbG9uZ2l0dWRlLCB3aGljaCB3ZSB3aWxsIHVzZSB0byBwbG90IHRoZSBib3VuZGFyeSBvZiBlYWNoIE1hcmluZSBQcm90ZWN0ZWQgQXJlYSBvbiBvdXIgbWFwLiANCg0KVG8gc2V0IHVwIHRoZSBtYXAsIHdlIHdpbGwgZmlyc3QgbWFwIGEgYmxhbmsgbWFwIG9mIHRoZSBzdGF0ZSBvZiBDYWxpZm9ybmlhLiBXZSB3aWxsIHVzZSBidWlsdC1pbiAibGVhZmxldCIgbGlicmFyeSB0byBtYWtlIG91ciBtYXAuIExldCdzIHNldCBpdCB1cCBzbyB0aGF0IHdlIGNhbiBzZWUgdGhlIG9jZWFuIHRvcG9ncmFwaHkgdXNpbmcgdGhlIEVzcmkgT2NlYW4gQmFzZW1hcC4gV2UnbGwgc2F2ZSBvdXIgbWFwIGFzICJDYWxpZm9ybmlhTWFwIi4gVG8gcHJpbnQgdGhlIENhbGlmb3JuaWFNYXAsIHdlJ2xsIHR5cGUgaW4gQ2FsaWZvcm5pYU1hcC4gDQoNCg0KYGBge3J9DQojIGluc3RhbGwgYW5kIGxvYWQgdGhlIGxlYWZsZXQgcGFja2FnZSBzbyB0aGF0IHdlIGNhbiBtYWtlIG91ciBtYXANCmxpYnJhcnkobGVhZmxldCkNCg0KQ2FsaWZvcm5pYU1hcCA9IGxlYWZsZXQoKSAlPiUgIyBzdGFydCBhbiBlbXB0eSBtYXANCiAgIGFkZFByb3ZpZGVyVGlsZXMoIkVzcmkuT2NlYW5CYXNlbWFwIikgJT4lICMgYWRkIHRoZSBvY2VhbiBiYXNlbWFwIA0KICAgZml0Qm91bmRzKCAtMTI0LCA0MSwgLTExNiwgMzIpICMgem9vbSBpbiB0byB0aGUgY2FsaWZvcm5pYSBhcmVhDQoNCkNhbGlmb3JuaWFNYXAgIyBwcmludCB0aGUgbWFwDQoNCmBgYA0KTmljZSEgTm93IGxldCdzIGFkZCB0aGUgYm91bmRhcmllcyBvZiBhbGwgb2YgdGhlIE1hcmluZSBQcm90ZWN0ZWQgQXJlYXMgdGhhdCBhcmUgb24gdGhlIENhbGlmb3JuaWEgQ29hc3QuIFdlIHdpbGwgbG9vcCB0aHJvdWdoIGVhY2ggaW5kaXZpZHVhbCBNYXJpbmUgUHJvdGVjdGVkIGFyZWEsIGFuZCBwbG90IHRoZSBsYXRpdHVkZXMgYW5kIGxvbmdpdHVkZXMgb24gb3VyIENhbGlmb3JuaWEgbWFwLCB0aGF0IHdheSwgd2UgY2FuIHNlZSBBTEwgb2YgdGhlIE1hcmluZSBQcm90ZWN0ZWQgQXJlYXMgb24gb3VyIG1hcCB0b2dldGhlci4gV2Ugd2lsbCB1c2UgImFkZFBvbHlnb25zIiB0byBhZGQgZWFjaCBNYXJpbmUgUHJvdGVjdGVkIEFyZWEncyBib3VuZGFyeS4gWW91IGNhbiBwaWNrIHRoZSBjb2xvciB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIG1ha2UgdGhlIGJvdW5kYXJ5IGluIHRoZSAiY29sb3IiIHNlY3Rpb24gb2YgImFkZFBvbHlnb25zIi4gRm9yIHRoaXMgZXhhbXBsZSwgSSBtYWRlIHRoZSBjb2xvciByZWQsIGJ1dCB5b3UgY2FuIGNoYW5nZSBpdCB0byB3aGF0ZXZlciBjb2xvciB5b3Ugd291bGQgbGlrZSENCg0KYGBge3J9DQoNCiMgbG9vcCB0aHJvdWdoIGVhY2ggTVBBIGFuZCBwbG90IHRoZSBib3VuZGFyaWVzIG9uIG91ciBDYWxpZm9ybmlhIE1hcA0KZm9yKGkgaW4gMTpsZW5ndGgoQ2FsaWZvcm5pYSRTaXRlX05hbWUpKSB7DQpHZW8gPSBhcy5kYXRhLmZyYW1lKENhbGlmb3JuaWFbWzI1XV1bW2ldXVtbMV1dW1sxXV0pICN0aGUgZ2VvbWV0cnkgaXMgaW4gdGhlIDI1dGggY29sdW1uDQpMb25naXR1ZGUgPSBHZW8kVjEgI0xvbmdpdHVkZSBpcyBzYXZlZCBhcyBWYXJpYWJsZSAxDQpMYXRpdHVkZSA9IEdlbyRWMiAjTGF0aXR1ZGUgaXMgc2F2ZWQgYXMgVmFyaWFibGUgMg0KQ2FsaWZvcm5pYU1hcCA9IENhbGlmb3JuaWFNYXAgICU+JSANCiAgICAgICBhZGRQb2x5Z29ucyhsbmc9TG9uZ2l0dWRlLGxhdD1MYXRpdHVkZSwgDQogICAgICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgIyBJIHdhbnRlZCB0byBtYWtlIHRoZSBNUEFzIHJlZCwgYnV0IHlvdSBjYW4gcHV0IGFueSBjb2xvcnMgeW91IHdhbnQhDQogICAgICAgICAgICAgICAgICAgb3BhY2l0eSA9IC41LCANCiAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuMikNCn0NCg0KQ2FsaWZvcm5pYU1hcCAjIHByaW50IHRoZSBtYXANCmBgYA0KYGBgDQoNCmBgYA0KV293LCBDYWxpZm9ybmlhIGhhcyBhIExPVCBvZiBNYXJpbmUgUHJvdGVjdGVkIEFyZWFzISBMZXQncyBhbmFseXplIHNvbWUgZGF0YSBmcm9tIE1hcmluZSBQcm90ZWN0ZWQgQXJlYXMgaW4gQ2FsaWZvcm5pYSB0byBzZWUgZXhhY3RseSBob3cgdGhleSBoYXZlIGhlbHBlZCBpbiB0aGUgcHJvdGVjdGlvbiBvZiBtYXJpbmUgb3JnYW5pc21zISBXZSB3aWxsIG5lZWQgdG8gY29ubmVjdCB0byBhbiBvbmxpbmUgZGF0YWJhc2VzIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiBhYm91dCBtYXJpbmUgb3JnYW5pc21zLiBBZGRpdGlvbmFsbHksIHNvbWUgcGFja2FnZXMgaW4gUiB3aWxsIG5lZWQgdG8gYmUgaW5zdGFsbGVkIHNvIHRoYXQgd2UgY2FuIHNlZSBleGFjdGx5IHdoYXQgaXMgZ29pbmcgaW4gd2l0aCBvdXIgZGF0YS4gUnVuIHRoZSBjb2RlIGNodW5rIGJlbG93IHRvIGluc3RhbGwgdGhlIHBhY2thZ2VzIG5lY2Vzc2FyeSBmb3IgdGhpcyBhY3Rpdml0eS4gDQoNCmBgYHtyfQ0KI2xvYWQgbGlicmFyaWVzDQppbnN0YWxsLnBhY2thZ2VzKCJyb2JpcyIpDQpsaWJyYXJ5KHJvYmlzKQ0KbGlicmFyeSgnZ2dwbG90MicpDQppbnN0YWxsLnBhY2thZ2VzKCJybmF0dXJhbGVhcnRoIikNCmxpYnJhcnkoInJuYXR1cmFsZWFydGgiKQ0KaW5zdGFsbC5wYWNrYWdlcygicm5hdHVyYWxlYXJ0aGRhdGEiKQ0KbGlicmFyeSgicm5hdHVyYWxlYXJ0aGRhdGEiKQ0KbGlicmFyeShyb3BlcmF0b3JzKQ0KaW5zdGFsbC5wYWNrYWdlcygicm9wZXJhdG9ycyIpDQoNCmxpYnJhcnkobWFncml0dHIpIA0KaW5zdGFsbC5wYWNrYWdlcygidmVnYW4iKQ0KbGlicmFyeSh2ZWdhbikNCg0KaW5zdGFsbC5wYWNrYWdlcygibWVhc3VyZW1lbnRzIikNCmxpYnJhcnkobWVhc3VyZW1lbnRzKQ0KDQppbnN0YWxsZWQgPC0gcm93bmFtZXMoaW5zdGFsbGVkLnBhY2thZ2VzKCkpDQppZiAoICEoInJvYmlzIiAlaW4lIGluc3RhbGxlZCkgKXsNCiAgIGlmICggISgicmVtb3RlcyIgJWluJSBpbnN0YWxsZWQpIClpbnN0YWxsLnBhY2thZ2VzKCJyZW1vdGVzIikNCiAgIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJpb2Jpcy9yb2JpcyIpDQp9DQpsaWJyYXJ5KCJyb2JpcyIpDQoNCmluc3RhbGwucGFja2FnZXMoIndlbGxrbm93biIpDQppbnN0YWxsLnBhY2thZ2VzKCJWOCIpDQpsaWJyYXJ5KCJWOCIpDQpsaWJyYXJ5KCJ3ZWxsa25vd24iKQ0KDQpgYGANCmBgYA0KDQoNCmBgYA0KTGV0J3MgbG9vayBpbnRvIGEgc3BlY2lmaWMgTWFyaW5lIFByb3RlY3RlZCBBcmVhIG5vdy4gDQoNCg0KYGBge3J9DQoNClNjcmlwcHMgPSBmaWx0ZXIoQ2FsaWZvcm5pYSwgU2l0ZV9OYW1lID09ICJTY3JpcHBzIENvYXN0YWwgUmVzZXJ2ZSIpDQoNClNjcmlwcHNHZW8gPSBhcy5kYXRhLmZyYW1lKENhbGlmb3JuaWFbWzI1XV1bWzFdXVtbMV1dW1sxXV0pICN0aGUgZ2VvbWV0cnkgaXMgaW4gdGhlIDI1dGggY29sdW1uDQpTY3JpcHBzTG9uZ2l0dWRlID0gR2VvJFYxICNMb25naXR1ZGUgaXMgc2F2ZWQgYXMgVmFyaWFibGUgMQ0KU2NyaXBwc0xhdGl0dWRlID0gR2VvJFYyICNMYXRpdHVkZSBpcyBzYXZlZCBhcyBWYXJpYWJsZSAyDQoNCg0KUE9MWUdPTiA9IGxpc3QoUG9seWdvbiA9IGxpc3QoYyhMb25naXR1ZGUsIExhdGl0dWRlKSkpDQoNCg0KUE9MWUdPTiAgPSBsaXN0KGMoU2NyaXBwc0xvbmdpdHVkZSwgU2NyaXBwc0xhdGl0dWRlKSkNCg0KDQp4ID0gc3RfY2FzdChQT0xZR09OLCAiUE9MWUdPTiIpDQp4ID0gcG9seWdvbihQT0xZR09OKQ0KDQoNCldLUE9MWUdPTiA9IGdlb2pzb24yd2t0KFBPTFlHT04kUG9seWdvbikNCg0KdGF4YSA8LSBjaGVja2xpc3QoZ2VvbWV0cnkgPSAiUE9MWUdPTiAoKDIuMyA1MS44LCAyLjMgNTEuNiwgMi42IDUxLjYsIDIuNiA1MS44LCAyLjMgNTEuOCkpIikNCnRheGEgPC0gY2hlY2tsaXN0KGdlb21ldHJ5ID0gUE9MWUdPTikNCg0KDQptcCA8LSBsaXN0KE11bHRpUG9pbnQgPSBtYXRyaXgoYygxMDAsIDEwMSwgMy4xNCwgMy4xMDEsIDIuMSwgMi4xOCkpKQ0KDQoNCg0KcG9seSA8LSBsaXN0KFBvbHlnb24gPSBsaXN0KA0KbWF0cml4KGMoMTAwLjAwMSwgMTAxLjEsIDEwMS4wMDEsIDEwMC4wMDEsIDAuMDAxLCAwLjAwMSwgMS4wMDEsIDAuMDAxKSwgbmNvbCA9IDIpKSkNCmdlb2pzb24yd2t0KHBvbHkpDQpnZW9qc29uMndrdChwb2x5LCBmbXQ9NikNCg0KDQoNClNwZWNpZXNPY2N1cmVuY2UgPC0gb2NjdXJyZW5jZShnZW9tZXRyeSA9IHBvbHkpDQp0YXhhIDwtIGNoZWNrbGlzdChnZW9tZXRyeSA9IHBvbHkpDQoNCg0KDQoNCg0KeCA9IGRhdGEuZnJhbWUobGF0ID0gYygiMzLCsDQ5LjU3MyIsICIzMsKwNDcuOTQ1IiwgICIzMsKwNDcuOTQ1IiwgIjMywrA0OS41NzMiLCAiMzLCsDQ5LjU3MyIpLA0KICAgICAgICAgICAgICAgbG9uID0gYygiLTExN8KwMTkuMDAwIiwgIi0xMTfCsDIwLjUyOCIsICItMTE3wrAyMC4wNjgiLCAiLTExN8KwMTkuMDAwIiwgIi0xMTfCsDE5LjAwMCIpKQ0KDQp4JGxhdCA9IGdzdWIoJ8KwJywgJyAnLCB4JGxhdCkNCngkbG9uID0gZ3N1YignwrAnLCAnICcsIHgkbG9uKQ0KI2NvbnZlcnQgZnJvbSBkZWNpbWFsbWludXRlIHRvIGRlY2ltYWwgZGVncmVlDQp4JGxhdGRlYyA9IG1lYXN1cmVtZW50czo6Y29udl91bml0KHgkbGF0LCBmcm9tID0gJ2RlZ19kZWNfbWluJywgdG8gPSAnZGVjX2RlZycpDQp4JGxvbmRlYyA9IG1lYXN1cmVtZW50czo6Y29udl91bml0KHgkbG9uLCBmcm9tID0gJ2RlZ19kZWNfbWluJywgdG8gPSAnZGVjX2RlZycpDQpgYGANCg0KYGBge3J9DQoNCg0KDQoNCnRheGEgPC0gY2hlY2tsaXN0KGdlb21ldHJ5ID0gIlBPTFlHT04gKCgyLjMgNTEuOCwgMi4zIDUxLjYsIDIuNiA1MS42LCAyLjYgNTEuOCwgMi4zIDUxLjgpKSIpDQp0YXhhIDwtIGNoZWNrbGlzdChnZW9tZXRyeSA9IFBPTFlHT04pDQp0YXhhID0gZ2VvbWV0cnkob2NjdXJlbmNlKCkpDQoNCmxhdGxvbiA9IHJiaW5kKExvbmdpdHVkZSwgTGF0aXR1ZGUpDQoNCiMgPC0gb2NjdXJyZW5jZShnZW9tZXRyeSA9ICJQT0xZR09OICgoLTExNy4zMiAzMi44MywgLTExNy4zNCAzMi44MywgLTExNy4zMyAzMi44MCwgLTExNy4zMiAzMi44MCwgLTExNy4zMiAzMi44MykpICIpDQoNCmFuaW1hbHMgPSBmaWx0ZXIoU3BlY2llc09jY3VyZW5jZSwga2luZ2RvbSA9PSAiQW5pbWFsaWEiKSAjZmlsdGVyaW5nIHRoZSBkYXRhZnJhbWUgdG8gcHVsbCBvdXQgdGhlIGFuaW1hbHMNCnNvcnQodGFibGUoYW5pbWFscyRzY2llbnRpZmljTmFtZSksIGRlY3JlYXNpbmcgPSBUUlVFKVsxOjEwXSAjZmluZGluZyB0aGUgMTAgYW5pbWFscyB0aGF0IG9jY3VyIG1vc3Qgb2Z0ZW4gaW4gdGhlIGRhdGFmcmFtZQ0Ka2VscEJhc3MgPSBmaWx0ZXIoU3BlY2llc09jY3VyZW5jZSwgc2NpZW50aWZpY05hbWUgPT0gIlBhcmFsYWJyYXggY2xhdGhyYXR1cyIpICNzaW5jZSBrZWxwYmFzcyBpcyB0aGUgbW9zdCBjb21tb25seSBvY2N1cmluZyBhbmltYWwsIHB1bGwgb3V0IGluZm8gb24gdGhlIGtlbHAgYmFzcw0KDQpnZ3Bsb3Qoa2VscEJhc3MsIGFlcyh4ID0gZGF0ZV95ZWFyKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oY29sb3IgPSAiZGFya2JsdWUiLCBmaWxsID0gImxpZ2h0Ymx1ZSIpICsgDQogIGxhYnModGl0bGUgPSAiS2VscCBCYXNzIGluIEFuYWNhcGEgU3RhdGUgTWFyaW5lIFJlc2VydmUiLCB4ID0gIlllYXIiLCB5ID0gIiMgb2YgS2VscCBCYXNzIikgIyBtYWtlIGEgaGlzdG9ncmFtIHNob3dpbmcgdGhlIGtlbHAgYmFzcyBjb3VudCBmcm9tIDIwMDYgdGhyb3VnaCAyMDIwDQoNCg0KYGBgDQoNCg0K